package com.w.proxy.player.playerproxy.jdk;

import com.w.proxy.player.api.IDynamicProxy;
import com.w.proxy.player.api.IPlayer;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * 动态代理(JDK动态代理)
 *
 * @author wyw
 * @date 2018-10-21
 */
public class LoLDynamicProxy implements InvocationHandler {

    /**
     * 被代理的实例
     */
    Object object = null;

    /**
     * 注入被代理对象
     *
     * @param object 被代理对象
     */
    public LoLDynamicProxy(Object object) {
        this.object = object;
    }

    /**
     * 产生proxy对象
     *
     * @param <T> 泛型
     * @return
     */
    public <T> T getProxy() {
        return (T) Proxy.newProxyInstance(this.object.getClass().getClassLoader(),
                this.object.getClass().getInterfaces(),
                this);
    }


    /**
     * 调用被代理对象方法
     *
     * @param object
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object object, Method method, Object[] args) throws Throwable {
        // before 可以在方法执行前做任何操 作
        Object result = method.invoke(this.object, args);
        // after  可以在方法执行后做任何操作
        System.out.println(String.valueOf(result) + Arrays.toString(args));
        return result; // 返回method方法执行后的返回值
    }
}
